const WebSocket = require('ws');

// 假设这是我们的联想问题列表
const suggestionList = [
    '1',
    '天气',
    '查询订单',
    '订单号是789012',
    '订单怎么还没有送到',
    '修改订单',
    '取消订单',
    '损坏商品',
    '退货',
    '找回密码',
    '换货',
    '售后服务',
    '谢谢'
];

// 心跳检测间隔时间（毫秒）
const HEARTBEAT_INTERVAL = 5000;
// 心跳超时时间（毫秒）
const HEARTBEAT_TIMEOUT = 10000;

// 创建 WebSocket 服务器
const wss = new WebSocket.Server({ port: 8080 });

// 处理客户端连接
wss.on('connection', (ws) => {
    console.log('一个客户端连接');

    // 用于存储心跳定时器和超时定时器
    let heartbeatInterval;
    let heartbeatTimeout;

    // 发送心跳消息
    const sendHeartbeat = () => {
        ws.send(JSON.stringify({ type: 'heartbeat' }));
        // 设置超时定时器
        heartbeatTimeout = setTimeout(() => {
            console.log('心跳超时，关闭连接');
            ws.close();
        }, HEARTBEAT_TIMEOUT);
    };

    // 启动心跳检测
    const startHeartbeat = () => {
        heartbeatInterval = setInterval(sendHeartbeat, HEARTBEAT_INTERVAL);
    };

    // 停止心跳检测
    const stopHeartbeat = () => {
        clearInterval(heartbeatInterval);
        clearTimeout(heartbeatTimeout);
    };

    // 收到客户端消息
    ws.on('message', (message) => {
        console.log('收到消息:', message.toString());
        let m;
        try {
            m = JSON.parse(message.toString());
        } catch (e) {
            console.error('解析消息失败:', e);
            ws.close(); // 关闭无效的连接
            return;
        }

        // 处理心跳响应
        if (m.type === 'heartbeat') {
            clearTimeout(heartbeatTimeout);
            return;
        }

        // 如果消息类型是 'suggestion'，返回联想结果
        if (m.type === 'suggestion') {
            const filteredSuggestions = suggestionList.filter(suggestion =>
                suggestion.toLowerCase().includes(m.content.toLowerCase())
            );
            ws.send(JSON.stringify({ type: 'suggestion', suggestions: filteredSuggestions }));
            return; // 确保只返回联想建议列表
        } else {
            // 根据用户请求的内容做出回应
            const sendResponse = (content) => {
                ws.send(JSON.stringify({ type: 'chat', content }));
            };

            switch (m.content) {
                case '1':
                    sendResponse('你好啊');
                    break;
                case '天气':
                    sendResponse('今天北京天气晴');
                    break;
                case '查询订单':
                    sendResponse('您好！请问您的订单号是多少？');
                    break;
                case '订单号是789012':
                    sendResponse('谢谢您提供的订单号。您的订单目前处于发货状态，预计2天内送达。');
                    break;
                case '订单怎么还没有送到':
                    sendResponse('非常抱歉给您带来不便。您的订单可能遇到了一些延迟，我们正在积极处理。预计送达时间可能会有所推迟。');
                    break;
                case '修改订单':
                    sendResponse('好的，请问您需要修改什么信息？是送货地址还是联系电话？');
                    break;
                case '取消订单':
                    sendResponse('好的，请问您能提供一下订单号吗？我们将为您处理取消订单的手续。');
                    break;
                case '损坏商品':
                    sendResponse('非常抱歉给您带来不便。请您提供订单号和商品损坏的图片，我们将为您安排退货或换货。');
                    break;
                case '退货':
                    sendResponse('好的，请您提供订单号和退货原因。我们将为您处理退货申请。');
                    break;
                case '找回密码':
                    sendResponse('请您点击登录页面上的“忘记密码”链接，然后按照提示操作即可。');
                    break;
                case '换货':
                    sendResponse('请您提供订单号和换货原因。我们将为您处理换货申请。');
                    break;
                case '售后服务':
                    sendResponse('我们的售后服务非常周到，您可以随时联系我们，我们将竭诚为您解决问题。');
                    break;
                case '谢谢':
                    sendResponse('不客气，很高兴能帮到您。如果您还有其他问题，请随时联系我们。');
                    break;
                default:
                    sendResponse('有什么可以帮助你');
                    break;
            }
        }
    });

    // 连接关闭
    ws.on('close', () => {
        console.log('一个客户端断开连接');
        stopHeartbeat();
    });

    // 处理错误
    ws.on('error', (err) => {
        console.error('WebSocket 错误:', err);
        stopHeartbeat();
    });

    // 启动心跳检测
    startHeartbeat();
});

console.log('WebSocket 服务器启动在 ws://localhost:8080');